{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "qT_RWmTEugu9"
   },
   "source": [
    "# Reducing Numerical Errors with Neural Operators\n",
    "\n",
    "In this example we will target numerical errors that arise in the discretization of a continuous PDE $\\mathcal P^*$, i.e. when we formulate $\\mathcal P$. This approach will demonstrate that, despite the lack of closed-form descriptions, discretization errors often are functions with regular and repeating structures and, thus, can be learned by a discretized neural operator. Once trained, the neural network (NN) can be evaluated locally to improve the solution of a PDE-solver, i.e., to reduce its numerical error. The resulting method is a hybrid one: it will always perform (a coarse) PDE solve, and then improve it at runtime with corrections inferred by an NN.\n",
    "\n",
    "\n",
    "Pretty much all numerical methods contain some form of iterative process: repeated updates over time for explicit solvers, or within a single update step for implicit or steady-state solvers.\n",
    "An example for the second case could be found [here](https://github.com/tum-pbs/CG-Solver-in-the-Loop),\n",
    "but below we'll target the first case, i.e. iterations over time.\n",
    "[[run in colab]](https://colab.research.google.com/github/tum-pbs/pbdl-book/blob/main/diffphys-code-sol.ipynb)\n",
    "\n",
    "\n",
    "## Problem formulation\n",
    "\n",
    "In the context of reducing errors, it's crucial to have a _differentiable physics solver_, so that the learning process can take the updates of the solver into account. This interaction is not possible with supervised- or PINN-based training. Even small inference errors of a supervised NN accumulate over time, and lead to a data distribution that differs from the distribution of the pre-computed data. This distribution shift leads to sub-optimal results, or even cause blow-ups of the solver.\n",
    "\n",
    "In order to learn the error function, we'll consider two different discretizations of the same PDE $\\mathcal P^*$:\n",
    "a _reference_ version, which we assume to be accurate and high fidelity, with a discretized version\n",
    "$\\mathcal P_r$, and solutions $\\mathbf r \\in \\mathscr R$, where $\\mathscr R$ denotes the manifold of solutions of $\\mathcal P_r$.\n",
    "In parallel to this, we have a lower fidelty solver for the same PDE, which we'll refer to as the _source_ version, as this will be the solver that our NN should later on interact with. Analogously,\n",
    "we have $\\mathcal P_s$ with solutions $\\mathbf s \\in \\mathscr S$.\n",
    "After training, we'll obtain a _hybrid_ solver that the source solver $\\mathcal P_s$ in conjunction with a trained operator to obtain improved solutions, i.e., solutions that are closer to the ones produced by $\\mathcal P_r$.\n",
    "\n",
    "```{figure} resources/diffphys-sol-manifolds.jpeg\n",
    "---\n",
    "height: 150px\n",
    "name: diffphys-sol-manifolds\n",
    "---\n",
    "Visual overview of coarse and reference manifolds\n",
    "```\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tayrJa7_ZzS_"
   },
   "source": [
    "\n",
    "Let's assume $\\mathcal{P}$ advances a solution by a time step $\\Delta t$, and let's denote $n$ consecutive steps by a superscript:\n",
    "$\n",
    "\\newcommand{\\pde}{\\mathcal{P}}\n",
    "\\newcommand{\\pdec}{\\pde_{s}}\n",
    "\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}}\n",
    "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}}\n",
    "\\newcommand{\\vcN}{\\vs}          \n",
    "\\newcommand{\\project}{\\mathcal{T}}   \n",
    "\\pdec^n ( \\mathcal{T} \\vr{t} ) = \\pdec(\\pdec(\\cdots \\pdec( \\mathcal{T} \\vr{t}  )\\cdots)) .\n",
    "$\n",
    "The corresponding state of the simulation is\n",
    "$\n",
    "\\mathbf{s}_{t+n} = \\mathcal{P}^n ( \\mathcal{T} \\mathbf{r}_{t} ) .\n",
    "$\n",
    "Here we assume a mapping operator $\\mathcal{T}$ exists that transfers a reference solution to the source manifold. This could, e.g., be a simple downsampling operation.\n",
    "Especially for longer sequences, i.e. larger $n$, the source state\n",
    "$\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}} \\vc{t+n}$\n",
    "will deviate from a corresponding reference state\n",
    "$\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \\vr{t+n}$.\n",
    "This is what we will address with an NN-based operator in the following.\n",
    "\n",
    "As before, we'll use an $L^2$-norm to quantify the deviations, i.e.,\n",
    "an error function $\\newcommand{\\loss}{e}\n",
    "\\newcommand{\\corr}{\\mathcal{C}}\n",
    "\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}}\n",
    "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}}\n",
    "\\loss (\\vc{t},\\mathcal{T} \\vr{t})=\\Vert\\vc{t}-\\mathcal{T} \\vr{t}\\Vert_2$.\n",
    "Our learning goal is to train at a correction operator\n",
    "$\\mathcal{C} ( \\mathbf{s} )$ such that\n",
    "a solution to which the correction is applied has a lower error than the original unmodified (source)\n",
    "solution: $\\newcommand{\\loss}{e}\n",
    "\\newcommand{\\corr}{\\mathcal{C}}\n",
    "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}}\n",
    "\\loss ( \\mathcal{P}_{s}( \\corr (\\mathcal{T} \\vr{t}) ) , \\mathcal{T} \\vr{t+1}) < \\loss ( \\mathcal{P}_{s}( \\mathcal{T} \\vr{t} ), \\mathcal{T} \\vr{t+1})$.\n",
    "\n",
    "The correction operator $\\newcommand{\\vcN}{\\mathbf{s}} \\newcommand{\\corr}{\\mathcal{C}} \\corr (\\vcN | \\theta)$ is represented \n",
    "as a deep neural network with weights $\\theta$ and receives the state $\\mathbf{s}$ to infer an additive correction field with the same dimension.\n",
    "To distinguish the original states $\\mathbf{s}$ from the corrected ones, we'll denote the latter with an added tilde $\\tilde{\\mathbf{s}}$.\n",
    "The overall learning goal now becomes\n",
    "\n",
    "$$\n",
    "\\newcommand{\\corr}{\\mathcal{C}}  \n",
    "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}}\n",
    "\\text{arg min}_\\theta \\big( ( \\mathcal{P}_{s} \\corr )^n ( \\mathcal{T} \\vr{t} ) - \\mathcal{T} \\vr{t+n} \\big)^2\n",
    "$$\n",
    "\n",
    "To simplify the notation, we've dropped the sum over different samples here (the $i$ from previous versions).\n",
    "A crucial bit that's easy to overlook in the equation above, is that the correction depends on the modified states, i.e.\n",
    "it is a function of\n",
    "$\\tilde{\\mathbf{s}}$, so we have\n",
    "$\\newcommand{\\vctN}{\\tilde{\\mathbf{s}}} \\newcommand{\\corr}{\\mathcal{C}} \\corr (\\vctN | \\theta)$.\n",
    "These states actually evolve over time when training. They don't exist beforehand.\n",
    "\n",
    "**TL;DR**:\n",
    "We'll train a neural operator $\\mathcal{C}$ to reduce the numerical errors of a simulator with respect to a more accurate reference. It's crucial to have the _source_ solver realized as a differential physics operator, such that it provides gradients for an improved training of $\\mathcal{C}$.\n",
    "\n",
    "<br>\n",
    "\n",
    "---\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "hPgwGkzYdIww"
   },
   "source": [
    "## Getting started with the implementation\n",
    "\n",
    "The following replicates an experiment from [Solver-in-the-loop: learning from differentiable physics to interact with iterative pde-solvers](https://ge.in.tum.de/publications/2020-um-solver-in-the-loop/) {cite}`um2020sol`, further details can be found in section B.1 of the [appendix](https://arxiv.org/pdf/2007.00016.pdf) of the paper.\n",
    "\n",
    "First, let's import the necessary libraries, most importantly [phiflow](https://tum-pbs.github.io/PhiFlow/) and [PyTorch](https://pytorch.org/), and let's get the device handling out of the way, so that we can focus on the _interesting_ parts..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "This notebook is running locally, please make sure the necessary pip packages are isntalled.\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    import google.colab  # to ensure that we are inside colab\n",
    "    !pip install --upgrade --quiet phiflow==3.3\n",
    "    #!pip install --upgrade --quiet git+https://github.com/tum-pbs/PhiFlow@develop\n",
    "    \n",
    "    # for pbdl-dataset:\n",
    "    !pip install --upgrade --quiet git+https://github.com/tum-pbs/pbdl-dataset\n",
    "\n",
    "except ImportError:\n",
    "    print(\"This notebook is running locally, please make sure the necessary pip packages are installed.\")\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "JwZudtWauiGa",
    "outputId": "bb03fd1b-62e7-4657-fe80-046b11c9852d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using device: cuda:0\n"
     ]
    }
   ],
   "source": [
    "import os, sys, logging, argparse, pickle, glob, random, pylab, time\n",
    "from tqdm import tqdm\n",
    "from phi.torch.flow import *\n",
    "\n",
    "random.seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "math.seed(42) # phiflow seed\n",
    "math.set_global_precision(32) # single precision\n",
    "\n",
    "USE_CPU = 0\n",
    "TORCH.set_default_device(\"GPU\")\n",
    "device = 'cuda:0' if torch.cuda.is_available() else 'cpu'\n",
    "if USE_CPU > 0:\n",
    "    device = 'cpu'\n",
    "device = torch.device(device)\n",
    "print(\"Using device: \"+str(device))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "RY1F4kdWPLNG"
   },
   "source": [
    "And while we're at it, we also set the random seed - obviously, 42 is the ultimate choice here 🙂"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OhnzPdoww11P"
   },
   "source": [
    "## Simulation setup\n",
    "\n",
    "Now we set up the _source_ simulation $\\mathcal{P}_{s}$.\n",
    "Note that we won't deal with\n",
    "$\\mathcal{P}_{r}$\n",
    "in this notebook: the downsampled reference data is from the high-fidelty solve is already contained in the training data set. It was generated with a four times finer spatial and temporal discretization. Below we're focusing on the interaction of the source solver and the NN.\n",
    "\n",
    "The `KarmanFlow` solver below simulates a relatively standard Navier-Stokes wake flow case with a spherical obstacle in a rectangular domain, and an explicit viscosity solve to obtain different Reynolds numbers. This is the geometry of the setup:\n",
    "\n",
    "```{figure} resources/diffphys-sol-domain.png\n",
    "---\n",
    "height: 200px\n",
    "name: diffphys-sol-domain\n",
    "---\n",
    "Domain setup for the wake flow case (sizes in the imlpementation are using an additional factor of 100).\n",
    "```\n",
    "\n",
    "The solver applies inflow boundary conditions for the y-velocity with a pre-multiplied mask (`vel_BcMask`), to set the y components at the bottom of the domain during the simulation step. This mask is created with the `HardGeometryMask` from phiflow, which initializes the spatially shifted entries for the components of a staggered grid correctly. The simulation step is quite straight forward: it computes contributions for viscosity, inflow, advection and finally makes the resulting motion divergence free via an implicit pressure solve:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "6WNMcdWUw4EP"
   },
   "outputs": [],
   "source": [
    "RE_FAC_SOL = 10/(128*128) # factor to compensate for the original scaling from the original solver-in-the-loop paper\n",
    "\n",
    "class KarmanFlow():\n",
    "    def __init__(self, domain):\n",
    "        self.domain = domain\n",
    "\n",
    "        self.vel_BcMask = self.domain.staggered_grid( HardGeometryMask( Box(y=(None, 5), x=None) ) )\n",
    "\n",
    "        self.inflow = self.domain.scalar_grid(Box(y=(5,10), x=(25,75)) ) # scale with domain if necessary!\n",
    "        self.obstacles = [Obstacle(Sphere(center=tensor([50, 50], channel(vector=\"y,x\")), radius=10))]\n",
    "\n",
    "    def step(self, marker_in, velocity_in, Re, res, buoyancy_factor=0, dt=1.0):\n",
    "        velocity = velocity_in\n",
    "        marker   = marker_in\n",
    "        Re_phiflow = Re / RE_FAC_SOL # rescale for phiflow\n",
    "\n",
    "        # viscosity\n",
    "        velocity = phi.flow.diffuse.explicit(u=velocity, diffusivity=1.0/Re_phiflow*dt*res*res, dt=dt)\n",
    "\n",
    "        # inflow boundary conditions\n",
    "        velocity = velocity*(1.0 - self.vel_BcMask) + self.vel_BcMask * (1,0)\n",
    "\n",
    "        # advection\n",
    "        marker = advect.semi_lagrangian(marker+ 1. * self.inflow, velocity, dt=dt)\n",
    "        velocity = advected_velocity = advect.semi_lagrangian(velocity, velocity, dt=dt)\n",
    "\n",
    "        # mass conservation (pressure solve)\n",
    "        pressure = None\n",
    "        velocity, pressure = fluid.make_incompressible(velocity, self.obstacles)\n",
    "        self.solve_info = { 'pressure': pressure, 'advected_velocity': advected_velocity }\n",
    "\n",
    "        return [marker, velocity]\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "mP-5ZNNy1FoE"
   },
   "source": [
    "Note that the `marker` density here denotes a passively advected marker field, and not the density of the fluid. Below we'll only be focusing on the velocity for the correction task. The marker density is tracked purely for visualization purposes.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "RYFUGICgxk0K"
   },
   "source": [
    "## Network and transfer functions\n",
    "\n",
    "We'll also define a simple neural networks to represent the operator\n",
    "$\\newcommand{\\vcN}{\\mathbf{s}} \\newcommand{\\corr}{\\mathcal{C}} \\corr$. We'll use fully convolutional networks, i.e. networks without any fully-connected (MLP) layers. We'll use phiflow's network tools to set up a `conv_net` with a given number of layers as specified in the `layers` list.\n",
    "The inputs to the network are 3 fields:\n",
    "- 2 fields with x,y velocity\n",
    "- the Reynolds number as constant channel.\n",
    "\n",
    "The output is:\n",
    "- a 2 component field containing the x,y velocity.\n",
    "\n",
    "In the conv-net, the input dimensions are determined from input tensor (it has three channels: u,v, and Re). Then we process the data via the sequence of conv layers and activations with 32 (and 48) features each, before reducing to 2 channels in the output. The code below also re-initializes the convolutions with a uniform Xavier initializer that is downscaled with a gain of `0.1`. The simplifies training by avoiding overly large values at the beginning. With it, we can direclty activate unrolling multiple steps. Without it, we'd need to add a curriculum and make sure the network is trained for a bit to find a suitable range for the corrections, before being applied to longer sequences via unrolling.\n",
    "\n",
    "While we're at it, we (of course) also checking the number of paramters in the network. This is a crucial metric for the approximate computational cost of the NN."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "qIrWYTy6xscA",
    "outputId": "209465bc-507e-4cd1-de90-2df940cda497"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ResNet(\n",
      "  (Res_in): ResNetBlock(\n",
      "    (sample_input): Conv2d(3, 32, kernel_size=(1, 1), stride=(1, 1))\n",
      "    (bn_sample): Identity()\n",
      "    (bn1): Identity()\n",
      "    (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (bn2): Identity()\n",
      "    (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  )\n",
      "  (Res1): ResNetBlock(\n",
      "    (sample_input): Identity()\n",
      "    (bn_sample): Identity()\n",
      "    (bn1): Identity()\n",
      "    (conv1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (bn2): Identity()\n",
      "    (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  )\n",
      "  (Res2): ResNetBlock(\n",
      "    (sample_input): Identity()\n",
      "    (bn_sample): Identity()\n",
      "    (bn1): Identity()\n",
      "    (conv1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (bn2): Identity()\n",
      "    (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  )\n",
      "  (Res_out): Conv2d(32, 2, kernel_size=(1, 1), stride=(1, 1))\n",
      ")\n",
      "Total number of trainable parameters: 47330\n"
     ]
    }
   ],
   "source": [
    "layers = [32,32,32] # small\n",
    "#layers = [32,48,48,48,32] # uncomment for a somewhat larger and deeper network\n",
    "#network = conv_net(in_channels=3,out_channels=2,layers=layers) # a simpler variant\n",
    "network = res_net(in_channels=3,out_channels=2,layers=layers)\n",
    "print(network)\n",
    "\n",
    "# reinit\n",
    "import torch.nn as nn\n",
    "for m in network.modules():\n",
    "    if isinstance(m, nn.Conv2d):\n",
    "        nn.init.xavier_uniform_(m.weight, gain=0.1)\n",
    "\n",
    "print(\"Total number of trainable parameters: \"+ str( sum(p.numel() for p in network.parameters()) ))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ew-MgPSlyLW-"
   },
   "source": [
    "Next, we're defining transfer functions which are pretty important: they don't modify any content, but transform the simulation state into suitable data structures for the different software packages that are used: staggered grids for the solver, pytorch tensors for the NN, and another helper to turn the numpy output of the dataloader into phiflow grids and values that can easily be used in the NS solver.\n",
    "\n",
    "The `to_phiflow` function takes a pytorch tensor `batch` and transforms the two relevant channels (1 and 2 in the second dimension for x and y) into a staggered grid for phiflow. The only caveat here is the size of the arrays involved:\n",
    "due to the closed and open boundaries and the staggered grid, phiflow expects arrays of size\n",
    "`[64, 31]` and  `[65, 32]` for x and y, respectively. In phiflow's `math.tensor` call we then have to tell phiflow about the batch and spatial dimensions.\n",
    "\n",
    "The `to_pytorch` function receives a small list with `[marker,velocity]`, and\n",
    "uses the two vector components of the staggered grid velocity via `vector['x']` and `vector['y']` to discard the outermost layer of the velocity field grids. This gives two tensors of equal size that are stacked along the `channels` dimension.\n",
    "It also adds a constant channel via `math.ones` that is multiplied by the desired Reynolds number in `ext_const_channel` onto the stack. The resulting stack of grids is turned into a single pytorch tensor via `native(order='batch,channels,y,x')` and represents the input to the neural network.\n",
    "\n",
    "The last function is a helper to transform the output of the dataloader into data structurs for phiflow.\n",
    "The data loader produces numpy arrays, and they're transformed into a velocity grid with the `to_phiflow` function from above. At the same time, we're normalizing the Reynolds number for the NN operator, and we keep the original one as a scalar value for the phiflow solver, as the latter uses \"physical units\", in contrast to the network. Each batch for training will contain multiple samples with the same Reynolds number. This is taken care of by the dataloader.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "hhGFpTjGyRyg"
   },
   "outputs": [],
   "source": [
    "def to_phiflow(batch):\n",
    "    vx = batch[:,1,:-1,:-1]\n",
    "    vy = batch[:,2,:,:] # fine\n",
    "\n",
    "    #print(\"v_dims \"+str([vx.shape,vy.shape])) # example for debugging\n",
    "    # v_dims should be vx [torch.Size([B, 64, 31]),  vy torch.Size([B, 65, 32])]\n",
    "\n",
    "    vel = domain.staggered_grid( math.stack( [\n",
    "                            math.tensor(vy, math.batch('batch'), math.spatial('y, x')),\n",
    "                            math.tensor(vx, math.batch('batch'), math.spatial('y, x')),\n",
    "                        ], math.dual(vector=\"y,x\")\n",
    "                    ) )\n",
    "    return vel\n",
    "\n",
    "def to_pytorch(marker_vel, Re):\n",
    "    # align the sides the staggered velocity grid making its size the same as the centered grid\n",
    "    grid = math.stack(\n",
    "        [\n",
    "            math.pad( marker_vel[1].vector['x'].values, {'x':(0,1)} , math.extrapolation.ZERO), # x component\n",
    "            marker_vel[1].vector['y'].y[:-1].values,                                            # y component\n",
    "            math.ones(marker_vel[0].shape)*Re                                                   # constant Re\n",
    "        ],\n",
    "        math.channel('channels')\n",
    "    ).native(order='batch,channels,y,x')\n",
    "    return grid\n",
    "\n",
    "def to_solver(inputs):\n",
    "    marker_in = inputs[:,0,:-1,:]\n",
    "    marker_in = domain.scalar_grid( math.tensor(marker_in, math.batch('batch'), math.spatial('y, x')) )\n",
    "    v_in = to_phiflow(inputs)\n",
    "    Re = math.tensor(inputs[0,3, 0,0].detach()) # Scalar , get first index 0,0\n",
    "\n",
    "    Re_norm = (Re - math.tensor(DATA_RE_MEAN)) / math.tensor(DATA_RE_STD)\n",
    "    Re_norm = float(Re_norm.native().detach()) # we just need a single number\n",
    "\n",
    "    return marker_in, v_in, Re, Re_norm\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VngMwN_9y00S"
   },
   "source": [
    "---\n",
    "\n",
    "## Training setup\n",
    "\n",
    "Now we also need to take care to set up the training, i.e. intialize data sets and optimizers. The latter is relatively easy, we'll use an Adam optimizer with a given learning rate, and this is also a good time to define the batch size (3 is a good default here).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "Dfwd4TnqN1Tn"
   },
   "outputs": [],
   "source": [
    "LEARNING_RATE = 1e-3\n",
    "optimizer = adam(network, LEARNING_RATE)\n",
    "\n",
    "# one of the most crucial parameters: how many simulation steps to look into the future in each training step\n",
    "MSTEPS = 4\n",
    "\n",
    "BATCH_SIZE = 3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bIWnyPYlz8q7"
   },
   "source": [
    "The most important and interesting parameter is `MSTEPS`. It defines the number of simulation steps that are unrolled at each training iteration. This directly influences the runtime of each training step, as we first have to simulate all steps forward, and then backpropagate the gradient through all `MSTEPS` simulation steps interleaved with the NN evaluations. However, this is where we'll receive important feedback in terms of gradients how the inferred corrections actually influence a running simulation. Hence, larger `msteps` are typically better. Ideally, the training also increases the number of `MSTEPS` over time in the form of a curriculum, but we'll omit that to keep the code simpler.\n",
    "\n",
    "For the training data itself, we can use PBDL's data loader class, which automatically downloads the data from HuggingFace (if necessary), and returns a class that we can easily iterate over to get a new batch for training. Here we need to specify the `BATCH_SIZE`, and we select simulations 0 to 5 from the dataset, in order to keep cases 6 to 9 for testing later on. The first 6 contain an intermediate range of Reynolds numbers, so that we can keep some new ones outside of this range for testing generalization later on. The dataloader also needs to provide enough steps of the ground truth reference to compute the loss for the full unrolled trajectory. This is ensured via `time_steps=MSTEPS+1, intermediate_time_steps=True`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "59EBdEdj0QR2",
    "outputId": "3fb7f0f4-a515-4478-ec4d-18a329ad693b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[Kdownload completed\t ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[38;5;240m\u001b[96m 100%\u001b[0m6m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\n",
      "\u001b[96m\u001b[1mSuccess:\u001b[22m Loaded solver-in-the-loop-wake-flow with 10 simulations (6 selected) and 496 samples each.\u001b[0m\n",
      "\u001b[1mInfo:\u001b[22m No precomputed normalization data found (or not complete). Calculating data...\u001b[0m\n",
      "[np.float64(1237.79296875), np.float64(1453.7359614526729)]\n"
     ]
    }
   ],
   "source": [
    "import pbdl\n",
    "import pbdl.torch.loader\n",
    "\n",
    "dataloader = pbdl.torch.loader.Dataloader(\"solver-in-the-loop-wake-flow\", MSTEPS, shuffle=True, sel_sims=[0,1,2,3,4,5],\n",
    "                                          batch_size=BATCH_SIZE, normalize_const=\"std\", normalize_data=\"std\", intermediate_time_steps=True)\n",
    "\n",
    "# workaround for using un-normalized and normalized values in one script:\n",
    "#    save the normalization constants of the Reynolds number conditioning , then turn off (norm=None);\n",
    "#    the Re values will be normalized manually later on\n",
    "DATA_RE_MEAN = dataloader.dataset.norm_strat_const.const_mean[0][0]\n",
    "DATA_RE_STD  = dataloader.dataset.norm_strat_const.const_std[0][0]\n",
    "print([DATA_RE_MEAN,DATA_RE_STD])\n",
    "dataloader.dataset.norm_strat_const = None\n",
    "dataloader.dataset.norm_strat_data = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0N92RooWPzeA"
   },
   "source": [
    "Additionally, we defined several global variables to control the training and the simulation in the next code cell.\n",
    "\n",
    "The fluid solver object is called `simulator` below. In order to easily create grids in phiflow it uses a phiflow `Domain` object, which mostly exists for convenience purposes: it stores resolution, physical size, and boundary conditions of the domain. This information needs to be passed to every grid, and hence it's convenient to have it in one place in the form of the `Domain`. For the setup described above, we need different boundary conditions along x and y: closed walls, and free flow in and out of the domain, respecitvely."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "EjgkdCzKP2Ip",
    "outputId": "3ebef773-0d85-43de-9f78-c31719ccbd45",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_774262/1641432920.py:8: FutureWarning: Domain (phi.physics._boundaries) is deprecated and will be removed in a future release.\n",
      "Please create grids directly, replacing the domain with a dict, e.g.\n",
      "    domain = dict(x=64, y=128, bounds=Box(x=1, y=1))\n",
      "    grid = CenteredGrid(0, **domain)\n",
      "  from phi.physics._boundaries import Domain, OPEN, STICKY as CLOSED\n",
      "/tmp/ipykernel_774262/1641432920.py:15: DeprecationWarning: Domain is deprecated and will be removed in a future release. Use a dict instead, e.g. CenteredGrid(values, extrapolation, **domain_dict)\n",
      "  domain = phi.physics._boundaries.Domain(y=SOURCE_RES[0], x=SOURCE_RES[1], boundaries=BNDS, bounds=Box(y=2*LENGTH, x=LENGTH))\n",
      "/tmp/ipykernel_774262/1641432920.py:15: FutureWarning: Domain is deprecated and will be removed in a future release. Use a dict instead, e.g. CenteredGrid(values, extrapolation, **domain_dict)\n",
      "  domain = phi.physics._boundaries.Domain(y=SOURCE_RES[0], x=SOURCE_RES[1], boundaries=BNDS, bounds=Box(y=2*LENGTH, x=LENGTH))\n",
      "/tmp/ipykernel_774262/1529251970.py:7: DeprecationWarning: HardGeometryMask and SoftGeometryMask are deprecated. Use field.mask or field.resample instead.\n",
      "  self.vel_BcMask = self.domain.staggered_grid( HardGeometryMask( Box(y=(None, 5), x=None) ) )\n"
     ]
    }
   ],
   "source": [
    "# this is the actual resolution in terms of cells for phiflow (not too crucial)\n",
    "SOURCE_RES = [64,32]\n",
    "\n",
    "# this is the physical size in terms of abstract units for the bounding box of the domain (it's important for conversions between computational and physical units)\n",
    "LENGTH = 100.\n",
    "\n",
    "# for readability\n",
    "from phi.physics._boundaries import Domain, OPEN, STICKY as CLOSED\n",
    "\n",
    "BNDS = {\n",
    "    'y':(phi.physics._boundaries.OPEN,  phi.physics._boundaries.OPEN) ,\n",
    "    'x':(phi.physics._boundaries.STICKY,phi.physics._boundaries.STICKY)\n",
    "}\n",
    "\n",
    "domain = phi.physics._boundaries.Domain(y=SOURCE_RES[0], x=SOURCE_RES[1], boundaries=BNDS, bounds=Box(y=2*LENGTH, x=LENGTH))\n",
    "simulator = KarmanFlow(domain=domain)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "AbpNPzplQZMF"
   },
   "source": [
    "## Interleaving simulation and NN\n",
    "\n",
    "In order to efficiently run training with non-trivial simulations, it's a good idea to keep the runtime in mind. For efficient runs it's especially important to involve the GPUs used for training, and keep the data on the GPU as much as possible. For phiflow, this can largely be achieved by jit-compiling the central steps, and in the next code cell we'll do this for the Navier-Stokes simulation step. It involves an implicit pressure solve, among others, and is potentially called multiple times for each forward and backwards pass. Hence this is a good candidate for jit-compilation. (Try removing the `@jit_compile` statement to experience the slow-down yourself.)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "id": "5VCAzofU1FoH"
   },
   "outputs": [],
   "source": [
    "@jit_compile\n",
    "def simulation_step(marker,velocity,Re,resolution):\n",
    "    m,v = simulator.step(\n",
    "        marker_in=marker,\n",
    "        velocity_in=velocity,\n",
    "        Re=Re, res=resolution\n",
    "    )\n",
    "    return m,v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HWpyoUKE1FoH"
   },
   "source": [
    "Next comes the **most crucial** step in the whole setup: we define a function that encapsulates the chain of simulation steps and network evaluations in each training step. With the helper functions we've set up so far, it's actually pretty simple: we loop `MSTEPS` times, calling the simulator via `simulator_step` for an input state, and afterwards evaluate the correction operator via `network(to_pytorch(...))`. The NN correction is then added to the last simulation state in the `prediction` list of states. This list keeps around the marker density and velocity for each time step.\n",
    "\n",
    "Note that apart from the Reynolds number, we're not normalizing the states themselves as they're already in the -1 to 1 range. For other simulations it would be a good idea to normalize before invoking the network, and de-normalizing afterwards for the subsequent physics solving step."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "id": "KFp4eUta1FoH"
   },
   "outputs": [],
   "source": [
    "def training_step(inputs_targets):\n",
    "    [inputs, targets] = inputs_targets\n",
    "    marker_in, v_in, Re, Re_norm = to_solver(inputs)\n",
    "    prediction = [ [marker_in,v_in] ]\n",
    "    loss = 0\n",
    "\n",
    "    for i in range(MSTEPS):\n",
    "        m2,v2 = simulation_step(\n",
    "            marker=prediction[-1][0],\n",
    "            velocity=prediction[-1][1],\n",
    "            Re=Re, resolution=SOURCE_RES[1]\n",
    "        )\n",
    "\n",
    "        net_in = to_pytorch([m2,v2],Re_norm)\n",
    "        net_out = network(net_in)\n",
    "\n",
    "        cy = net_out[:,1,:,:] # pad y\n",
    "        cy = torch.nn.functional.pad(input=cy, pad=(0,0, 0,1), mode='constant', value=0)\n",
    "        cx = net_out[:,0,:,:-1]\n",
    "\n",
    "        v_corr = domain.staggered_grid( math.stack( [\n",
    "                            math.tensor(cy, math.batch('batch'), math.spatial('y, x')),\n",
    "                            math.tensor(cx, math.batch('batch'), math.spatial('y, x')),\n",
    "                        ], math.dual(vector=\"y,x\")\n",
    "                    ) )\n",
    "\n",
    "        prediction += [ [domain.scalar_grid(m2) , v2 + v_corr] ]\n",
    "        vdiff = prediction[-1][1] - to_phiflow(targets[:,i,...])\n",
    "        loss += field.l2_loss(vdiff)\n",
    "\n",
    "    return loss, prediction\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Sk82sacv1FoH"
   },
   "source": [
    "The `training_step` function above also directly evaluates and returns the loss. Here, we simply use an $L^2$ loss over the grids (in phiflow `fields`) for the whole sequence, i.e. over the unrolled `msteps`. In `vdiff` we're simply computing the difference between the targets and the current prediction, and then compute its `l2_loss`.\n",
    "\n",
    "With the training step, the training is quite simple: all that's left to do is to let the optimizer compute the gradients to minimize the loss. Phiflow provides a helper function for this: `update_weights`. We provide the neural network, the optimizer, and the function to compute the loss (the first return value of `training_step`). We simply loop `EPOCHS` times over enumerating the full dataset from the `dataloader`. The progress bar `pbar` below is simply eyecandy to track the progress of the training. Because the jit compilation of the simulator is triggered in the very first step takes a bit longer, but the subsequent ones should be substantially faster. The code below also saves the network state every epoch _N_ in a file `net-N.pickle`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "AJn5a5k31FoH",
    "outputId": "11f40f98-5554-4b6f-f436-c385d98534b0",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|                                                                  | 0/4960 [00:00<?, ?it/s]/tmp/ipykernel_774262/4154370188.py:7: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "  input = torch.tensor(input_cpu, dtype=torch.float32).to(device);\n",
      "/tmp/ipykernel_774262/4154370188.py:8: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "  targets = torch.tensor(targets_cpu, dtype=torch.float32).to(device)\n",
      "anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/math/_optimize.py:631: UserWarning: Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\n",
      "  warnings.warn(\"Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\")\n",
      "anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/backend/torch/_torch_backend.py:803: UserWarning: Sparse CSR tensor support is in beta state. If you miss a functionality in the sparse tensor support, please submit a feature request to https://github.com/pytorch/pytorch/issues. (Triggered internally at ../aten/src/ATen/SparseCsrTensorImpl.cpp:53.)\n",
      "  return torch.sparse_csr_tensor(row_pointers, column_indices, values, shape, device=values.device)\n",
      "anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/math/_optimize.py:631: UserWarning: Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\n",
      "  warnings.warn(\"Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\")\n",
      "loss 15.62617:   0%|                                        | 1/4960 [00:12<16:36:58, 12.06s/it]/tmp/ipykernel_774262/4154370188.py:7: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "  input = torch.tensor(input_cpu, dtype=torch.float32).to(device);\n",
      "/tmp/ipykernel_774262/4154370188.py:8: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "  targets = torch.tensor(targets_cpu, dtype=torch.float32).to(device)\n",
      "loss 0.23079132: 100%|████████████████████████████████████| 4960/4960 [3:10:57<00:00,  2.31s/it]\n"
     ]
    }
   ],
   "source": [
    "EPOCHS = 5\n",
    "\n",
    "pbar = tqdm(initial=0, total=EPOCHS*len(dataloader), ncols=96)\n",
    "\n",
    "for epoch in range(EPOCHS):\n",
    "    for b, (input_cpu, targets_cpu) in enumerate(dataloader):\n",
    "        input = torch.tensor(input_cpu, dtype=torch.float32).to(device);\n",
    "        targets = torch.tensor(targets_cpu, dtype=torch.float32).to(device)\n",
    "\n",
    "        loss, prediction = update_weights(network, optimizer, training_step, [input, targets])\n",
    "\n",
    "        pbar.set_description(\"loss \"+str(np.sum(loss.numpy(\"batch\"))), refresh=False); pbar.update(1)\n",
    "\n",
    "    torch.save(network.state_dict(), \"net-\"+str(epoch)+\".pickle\")\n",
    "\n",
    "pbar.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Wk1Z9PB71FoH"
   },
   "source": [
    "\n",
    "Note that each call to `update_weights` internally performs all 4 interleaved simulation steps and neural network calls, and back-propagates gradients for the whole chain. Due to the order, solver first, then network, the first step does not go back through the solver. However, for the next 3 steps, the first network call will receive feedback whether it's inferred correction influenced the 3 subsequent states towards the right direction or not.\n",
    "\n",
    "With the default parameters, the loss should go down from above 10 initially to around 1.0 (more epochs and larger/deeper networks will bring it down further). The decreasing loss is a good sign, but of course it's even more important to see how the resulting NN-solver combination fares on new inputs. With this training approach we've realized a hybrid solver, consisting of a regular _source_ simulator, and a network operator that was trained to specifically interact with this simulator for a chosen domain of simulation cases.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "UlCHHTW_1FoH"
   },
   "source": [
    "## Test evaluation\n",
    "\n",
    "In order to evaluate the performance of our \"AI-powered solver\", we essentially only need to repeat the inner loop of each training iteration for more steps. While we were limited to `msteps` evaluations at training time, we can now run our solver for arbitrary lengths. This is a good test for how well our solver has learned to keep the data within the desired distribution, and represents a generalization test for longer rollouts.\n",
    "\n",
    "We also need a set of new data. Below, we'll use the previously unused last four simulations of the dataset that was downloaded above. We simply instantiate a new dataloader with `sel_sims=[6,7,8,9]`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "id": "RPhPR9-51FoI"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[Kdownload completed\t ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[38;5;240m\u001b[96m 100%\u001b[0m6m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\u001b[96m\n",
      "\u001b[96m\u001b[1mSuccess:\u001b[22m Loaded solver-in-the-loop-wake-flow with 10 simulations (4 selected) and 300 samples each.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "del dataloader # close hdf5 file handle\n",
    "\n",
    "# get new & unseen test data\n",
    "dataloader_test = pbdl.torch.loader.Dataloader(\"solver-in-the-loop-wake-flow\", 200, batch_size=1, shuffle=True, sel_sims=[6,7,8,9],\n",
    "                                          normalize=False, intermediate_time_steps=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "yFu75G9n1FoI"
   },
   "source": [
    "In case you have a pre-trained network, this is a good point to load a model. By default, we assume the training above was completed, so it's not necessary to load anything."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "id": "NRJwUnRz1FoI"
   },
   "outputs": [],
   "source": [
    "# optionally load\n",
    "if False:\n",
    "    fn = \"net-\"+str(EPOCHS-1)+\".pickle\" # load last\n",
    "    network.load_state_dict(torch.load(fn, map_location=device, weights_only=True))\n",
    "    print(\"Loaded \"+fn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NEu96LeY1FoI"
   },
   "source": [
    "We can reuse a lot of the solver code from above, but in the following, we will consider two simulated versions: for comparison, we'll run one reference simulation in the _source_ manifold (i.e. based on $\\mathcal P_s$, without any corrections applied). The second version is the actual result, we'll repeatedly compute the source solver plus the learned correction.\n",
    "\n",
    "The `run_sim` function below switches between these two variants depending on whether a neural operator is provided in `network`. Without it, it simply runs the source solver and appends the states. With a `network` it runs the full hybrid solver. Both cases compute error w.r.t. reference along the way. For analysis and visualization later on, the function returns the correction and references in addition to the relative errors and the actual states computed by the solver."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "id": "RWC0mKNJ1FoI"
   },
   "outputs": [],
   "source": [
    "def run_sim(inputs, targets, steps, network=None):\n",
    "    marker_in, v_in, Re, Re_norm = to_solver(inputs)\n",
    "\n",
    "    simtype = \"With corr.\"\n",
    "    if (network==None): simtype = \"Sim. only\"\n",
    "    print(\"Running test with Re=\"+str(Re)+\", \"+simtype)\n",
    "\n",
    "    prediction = [ [marker_in,v_in] ]\n",
    "    correction = [ [marker_in,v_in] ]\n",
    "    refs = [ v_in ]\n",
    "    errors = []\n",
    "\n",
    "    for i in tqdm(range(steps), desc=simtype, ncols = 64):\n",
    "        marker_sim,v_sim = simulation_step(\n",
    "            marker=prediction[-1][0],\n",
    "            velocity=prediction[-1][1],\n",
    "            Re=Re, resolution=SOURCE_RES[1]  # take Re from constant field\n",
    "        )\n",
    "\n",
    "        if network: # run hybrid solver with trained Neural op\n",
    "            net_in = to_pytorch([marker_sim,v_sim],Re_norm)\n",
    "            net_out = network(net_in)\n",
    "\n",
    "            cy = net_out[:,1,:,:] # pad y\n",
    "            cy = torch.nn.functional.pad(input=cy, pad=(0,0, 0,1), mode='constant', value=0)\n",
    "            cx = net_out[:,0,:,:-1]\n",
    "\n",
    "            v_corr = domain.staggered_grid( math.stack( [\n",
    "                                math.tensor(cy, math.batch('batch'), math.spatial('y, x')),\n",
    "                                math.tensor(cx, math.batch('batch'), math.spatial('y, x')),\n",
    "                            ], math.dual(vector=\"y,x\")\n",
    "                        ) )\n",
    "\n",
    "            prediction += [ [domain.scalar_grid(marker_sim) , v_sim + v_corr] ]\n",
    "            correction += [ [domain.scalar_grid(marker_sim) , v_corr] ]\n",
    "\n",
    "        else: # only low-fidelity solver\n",
    "            prediction += [ [domain.scalar_grid(marker_sim) , v_sim ] ]\n",
    "\n",
    "        refs += [to_phiflow(targets[:,i,...])]\n",
    "        vdiff = prediction[i][1] - refs[-1]\n",
    "\n",
    "        error_phi = field.l1_loss(vdiff)\n",
    "        errors += [float( error_phi.native(\"batch\")[0] / field.l1_loss(refs[-1]).native(\"batch\")[0] )]\n",
    "\n",
    "    return errors, prediction, refs, correction\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ysBPP8r21FoI"
   },
   "source": [
    "With `next(iter(dataloader_test))` we'll get a new state from the dataloader with a previously unseen Reynolds number. Then we'll run source and hybrid solver for `ROLLOUT_STEPS` iterations starting from the same initial state. Similar to training, we'll first get an initial state and reference states from the dataloader in `input` and `targets`. (Due to the random sampling, you might need to run this multiple times to e.g. get one of the higher Re cases.)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "id": "aA7BRsSZ1FoJ"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Re  \u001b[94m73.24219\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_774262/1514360431.py:3: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "  input = torch.tensor(input_cpu, dtype=torch.float32).to(device)\n",
      "/tmp/ipykernel_774262/1514360431.py:4: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "  targets = torch.tensor(targets_cpu, dtype=torch.float32).to(device)\n"
     ]
    }
   ],
   "source": [
    "# get a sample\n",
    "(input_cpu, targets_cpu) = next(iter(dataloader_test))\n",
    "input = torch.tensor(input_cpu, dtype=torch.float32).to(device)\n",
    "targets = torch.tensor(targets_cpu, dtype=torch.float32).to(device)\n",
    "print(\"Re \",math.tensor(input[0,3, 0,0].detach()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "7kS6jU8j1FoJ"
   },
   "source": [
    "The interesting question of course is: how much does the NN operator actually improve the accuracy of the low-fidelity _source_ solver? This is captured by the relative $L_2$ errors computed each time by the `run_sim` function. It measures the squared distance in comparison to the squared magnitudes of the reference velocities. The cell above directly plots the aggregated errors.\n",
    "\n",
    "Below, we run the hybrid solver with its trained Neural correction operator and the low-fidelity solver alone for comparison.\n",
    "`ROLLOUT_STEPS` below determines the number of time steps to compute with both variants. The cell also directly outputs the mean relative error.\n",
    "Due to the stochastic training and numerical round-off errors, the results can vary slightly over different runs, but in general the hybrid solver with its Neural correction operator should show a significantly reduced numerical error: typically 5-6x lower than the low-fidelity solver.\n",
    "\n",
    "**This shows the central objective of this training setup has been achieved: the hybrid solver yields substantially reduced numerical errors and generalizes to new Reynolds numbers 👍**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "id": "QlsK9rG71FoJ"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running test with Re=\u001b[94m73.24219\u001b[0m, Sim. only\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Sim. only:   0%|                        | 0/100 [00:00<?, ?it/s]anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/math/_optimize.py:631: UserWarning: Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\n",
      "  warnings.warn(\"Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\")\n",
      "anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/math/_optimize.py:631: UserWarning: Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\n",
      "  warnings.warn(\"Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\")\n",
      "Sim. only: 100%|██████████████| 100/100 [00:31<00:00,  3.14it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running test with Re=\u001b[94m73.24219\u001b[0m, With corr.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "With corr.: 100%|█████████████| 100/100 [00:52<00:00,  1.89it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " Rel. L2 errors: low-fidelity: 0.10863638424314559  corrected: 0.031211425131186844\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "ROLLOUT_STEPS = 100\n",
    "\n",
    "err_lowfid_only, prediction_lowfid_only, refs, _   = run_sim(input, targets, ROLLOUT_STEPS)\n",
    "err_corrected,   prediction_corrected  , _ , corrs = run_sim(input, targets, ROLLOUT_STEPS, network)\n",
    "print(\"\\n Rel. L2 errors: low-fidelity:\", float(np.mean(err_lowfid_only)),\" corrected:\", float(np.mean(err_corrected)) )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "syC2KPDS1FoJ"
   },
   "source": [
    "Now we'll plot and compare the two versions in more detail. The next graph shows how the errors evolve over time. The relative errors of the low-fidelity solver rise linearly over time, while the hybrid solver yields a much slower increase. For larger networks and successful training runs, it can pretty much suppress any increase, and keep the errors at a very low level. This indicates, that it can successfully nudge the low-fidelity solver to preserve the accuracy of the targets. Note that this job would be much more difficult without the base solver: then the NN would need to do _all_ the work. Here, it can rely on the prediction of the coupled solver, and a small correction typically suffices."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "id": "ys_qAMGu1FoK"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7de77dc7b770>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = pylab.figure().gca()\n",
    "pltx = np.linspace(0,ROLLOUT_STEPS-1,ROLLOUT_STEPS)\n",
    "fig.plot(pltx, err_lowfid_only, lw=2, color='mediumblue', label='Source')\n",
    "fig.plot(pltx, err_corrected,   lw=2, color='green', label='Hybrid')\n",
    "pylab.xlabel('Time step'); pylab.ylabel('Relative L2 error'); fig.legend()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "eDK3M93b1FoK"
   },
   "source": [
    "While the quantified results give an important summary of the performance of our Neural operator, it's important to sanity check these results to make sure the NN works as intended. In the next cell, we'll plot the states of the reference, the low-fidelity solver and the hybrid solver side-by-side. Additionally, we'll plot the errors made by both solvers on the right side."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "id": "MZnqSzq21FoK"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABgkAAAHqCAYAAAA+g67LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXgV1f0/8PfM3C0JBGQNKJtawaosQokotKDRiEqlUheqFVGwWrFKqiitsqgVrRaxFaW4Bf1WUVvXH4pLlIItSgFppS0IFAWRBFAhEMjdZn5/xFy5c8/n3NzhhmzvF888D5mZM3Nm7tzzmblnzjmG4zgOiIiIiIiIiIiIiIioxTEbOgNERERERERERERERNQwWElARERERERERERERNRCsZKAiIiIiIiIiIiIiKiFYiUBEREREREREREREVELxUoCIiIiIiIiIiIiIqIWipUEREREREREREREREQtFCsJiIiIiIiIiIiIiIhaKFYSEBERERERERERERG1UKwkICIiIiIiIiIiIiJqoVhJQIfFhg0bcNZZZ6FNmzYwDAMvv/xyQ2eJiIiagPvuuw9HH300LMtC//79AQA9e/bEFVdckTZtaWkpDMPAp59+Wq95JCIiIiIiImrKWElAKWp/VKmdfD4fjjzySFxxxRXYtm2bp22OGzcOH3/8MX7zm9/g6aefxqBBg7KcayIi8qq23F+5cmVDZyXJW2+9hSlTpuC0007Dk08+ibvvvruhs0RERFm0adMm/OxnP8PRRx+NUCiE/Px8nHbaaXjwwQdx4MCBhs4eERERUYvha+gMUON1xx13oFevXqiursYHH3yA0tJSvP/++1i7di1CoVCdt3PgwAEsX74cv/71rzFp0qR6zDERETUn7777LkzTxOOPP45AIJCYv379epgm33MgImrKFi1ahAsvvBDBYBCXX345TjzxREQiEbz//vu4+eab8e9//xvz589v6GwSERERtQisJCDRyJEjE2/8T5gwAR06dMC9996LV199FRdddFGdt7Nz504AQNu2besjm0RE1Ezt2LEDOTk5SRUEABAMBhsoR0RElA2bN2/GJZdcgh49euDdd99Fly5dEsuuu+46bNy4EYsWLTqkfTiOg+rqauTk5KQsq66uRiAQYIUzERER0Td4V0R1NmzYMAA1zYJrrVu3Dj/+8Y/Rrl07hEIhDBo0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TsTRRx+NiooKLF++HJ9//jn++c9/NnR2iYgoA0888QQWL16cMn/GjBl4++23MXToUPz85z+Hz+fDH//4R4TDYfz2t79NWre2AmD9+vW4++67E/O///3v44033kAwGMT3vve9rOZ7ypQpePrpp3H22WfjhhtuQF5eHubPn48ePXrgX//6V9K6U6dOxYIFC7B582b07Nkzq/kgIqK6OeaYY/DMM8/g4osvxvHHH4/LL78cJ554IiKRCP7+97/jhRdewBVXXIEbbrgB48aNw/z587F792784Ac/wIoVK7BgwQKMHj0aI0aM8JwHxgMiIiKib7GSgDJywQUX4JhjjsH999+PiRMnYuXKlZg5cyZKS0vx5ZdfolOnThgwYACmTZvW0FklIqIMPfLII8r5V1xxBZYtW4apU6di1qxZsG0bhYWF+L//+z8UFhYmrdu7d2906tQJO3bsSOpGqLbyYPDgwQgGg1nNd5cuXfDee+/h+uuvxz333IP27dvjmmuuQdeuXXHVVVdldV9ERJQdP/zhD/Gvf/0L9913H1555RU88sgjCAaD6Nu3L373u99h4sSJAIDHHnsMRx99NEpLS/HSSy+hoKAAU6dOxfTp0xv4CIiIiIiaD8NxHKehM0FERERERERERERERIcfxyQgIiIiIiIiIiIiImqhWElARERERERERERERNRCsZKAiIiIiIiIiIiIiKiFYiUBEREREREREREREVE9WLp0KUaNGoWuXbvCMAy8/PLLadMsWbIEJ598MoLBII499liUlpbWax5ZSUBEREREREREREREVA+qqqrQr18/zJ07t07rb968Geeeey5GjBiBNWvW4MYbb8SECRPw5ptv1lseDcdxnHrbOhERERERERERERERwTAMvPTSSxg9erS4zi233IJFixZh7dq1iXmXXHIJdu/ejcWLF9dLvnz1stVDYNs2vvjiC7Ru3RqGYTR0doiaFcdxsHfvXnTt2hWm6b0hUXV1NSKRSBZzBgQCAYRCoaxuk1oexhCi+sH4QS0BYwhR/WAMISKihtQU48fy5ctRVFSUNK+4uBg33nhjve2z0VUSfPHFF+jWrVtDZ4OoWdu6dSuOOuooT2mrq6vRq9eRKC//Kqt5KigowObNm3mTToeEMYSofjF+UHPGGEJUvxhDiIjocKuurkavHvko3xHN6nYLCgrwz3/+Myl+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u3di2Z133olAIICbbroJ4XAYgUAApaWlGD9+PL73ve9h1qxZqKiowIMPPoi//e1v+Oijj5Lemo/FYiguLsbQoUNx//33Izc3F5FIBMXFxQiHw7j++utRUFCAbdu24f/9v/+H3bt3o02bNgCAhx56CDNnzsR7772H4cOHH/L5mDBhAhYsWIAf//jH+OUvf4kPP/wQs2bNwn//+1+89NJLAIBhw4bhgQcewL///W+ceOKJAGp+6DZNE8uWLcMvfvGLxDwA+P73vy/u74ILLkDbtm0xefLkRNdPrVq1EtefNm0a7rrrLpxzzjk455xzsHr1apx11lmIROrWgrt379449dRT8bvf/Q6XXHIJunfvXqd0XvzmN7/B7bffjosuuggTJkzAzp078Yc//AHf//73k66BF154Afv378e1116L9u3bY8WKFfjDH/6Azz//HC+88ELSNlXXSq33338fL774In7+85+jdevW+P3vf48xY8Zgy5YtaN++PYCaiptTTjklUanQsWNHvPHGG7jqqqtQWVmJG2+8EUBNF1BnnHEGtmzZgl/84hfo2rUrnn76abz77rv1dr6o8WAlARF5YztZ7A+0mVbDEhFRKsYPIiLyijGEsmT69OmYPn16yvzly5fjlFNOSfy9ceNGLF68GMXFxYl5S5YsAVDTxdDKlSsT3Q9Fo1HccsstOPHEE7F06VKEQiEAwNChQ3HeeefhgQcewMyZMxPbCYfDuPDCCzFr1qzEvDVr1mDz5s144YUX8OMf/zgxf9q0adk5cIV//vOfWLBgASZMmIBHH30UQE1XPJ06dcL999+P9957DyNGjMDQoUMB1FQCnHjiidizZw8+/vhjjBkzBkuXLk1sb9myZWjXrh2++93vivvs27cv8vPzMXny5LRdP+3cuRO//e1vce655+K1116D8U0fpb/+9a9x99131+kYKyoqUFVVhd27d+Oss87CsmXL0LFjxzqlzcRnn32G6dOn46677sKvfvWrxPwLLrgAAwYMwMMPP5yYf++99yZ1XXX11Vfj2GOPxa9+9Sts2bIlqSJDda3U+u9//4v//Oc/OOaYYwAAI0aMQL9+/fDss88mxnr49a9/jXg8jo8//jhRcXDNNddg7NixmDFjBn72s58hJycH8+fPxyeffILnn38eF154IQBg4sSJ6NevX5bP1OGXzQZkzTV8sLsh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jh9VVVXo168frrzySlxwwQVp11+6dCnOPPNM3H333Wjbti2efPJJjBo1Ch9++CEGDBiQWO+EE07AO++8k/j74IdjIiLKEj6DUJasXr0a//d//5cy/5hjjsGQIUM8bdPv9+Pee+/F+PHj8YMf/ABjx45FRUUFHnzwQfTs2ROTJ09Ou413330XkyZNwoUXXojjjjsOsVgMTz/9dOKH3loPPfQQZs6ciffee69Ogxdv3LhR2QphwIABOPfcczFu3DjMnz8fu3fvxg9+8AOsWLECCxYswOjRozFixIikNLVv4Z900kmJMQFOPvlk5OXl4ZNPPkkajyAbOnbsiJtuugmzZs3Ceeedh3POOQcfffQR3njjDXTo0CFt+vPOOw/nn38+Hn/8cWzcuBGjR49GMBjE4sWL8dprr+H73/8+3nvvPUybNg133HFH2u2lO5d33XUXpk6dik8//RSjR49G69atsXnzZrz00ku4+uqrcdNNN6FPnz445phjcNNNN2Hbtm3Iz8/HX/7ylzq1jPDinnvuwXvvvYfCwkJMnDgR3/3ud/HVV19h9erVeOedd/DVV18BACZOnIiHHnoIl19+OVatWoUuXbrg6aefRm5ubr3k63BynDRdIGa4reaITy9ERERE1GKMHDkSI0eOrPP67rfU7r77brzyyit47bXXkioJfD4fCgoKspVNIiIiqkfPPvssnn322ZT548aN81xJAABXXHEFcnNzcc899+CWW25BXl4efvSjH+Hee+9F27Zt06bv168fiouL8dprr2Hbtm3Izc1Fv3798MYbb+CUU07xnK/169fj9ttvT5l/1VVX4dxzz8Vjjz2Go48+GqWlpXjppZdQUFCAqVOnYvr06SlpaisJhg4dmpjn8/kwZMgQvPPOO0njEWTLXXfdhVAohHnz5iV+7H7rrbfq1DrDMAz85S9/wQMPPIDS0lLccsstyMnJwSmnnII333wTZ555Ji699FLceeedOPbYY5O6/1FJdy5vvfVWHHfccXjggQcwc+ZMAEC3bt1w1lln4Yc//CGAmgql1157LTHeRCgUwo9+9CNMmjQJ/fr183CG9Dp37owVK1bgjjvuwIsvvoiHH34Y7du3xwknnIB77703sV5ubi7Kyspw/fXX4w9/+ANyc3Nx6aWXYuTIkTj77LOzni9qXAynYUc+TVFZWYk2bdrgioJbETBD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e1FeXo5AIIC2bdsmpencuTPKy8vFbYbDYVRWViZNRETU/DCGEBGRF/URPwDGECIiAPj6669x2mmnwe/344033sB//vMf/O53v8MRRxyRWOe3v/0tfv/732PevHn48MMPkZeXh+LiYlRXVzdgzomIKJsy6m5o5MiRif/37dsXhYWF6NGjB55//nnk5Ah9x6cxa9YszJw501NaImpA7A+UMsQYQkQAGD8oY/URPwDGEKImiTEk6+69915069YNTz75ZGJer169Ev93HAdz5szBbbfdhvPPPx8A8NRTT6Fz5854+eWXcckll9R5X7UDygI1g/IeLF0f37ZihVg0eTyNsGvMsLjrMw663pN1b9O2k98O1o3DUss9rIhlJSfy+/R/uw/LPYCue0BcVZYc10bcbzmnnDpDvw+3Oo7Jm7zPDL9f7n24h85Kd32ohnexXB+gex9x3eBdSP383UOkufNkKi4Y9x7caQz3Z6fNUfrz4Ci2kHIu023UfaJcf5vuLbiOWzUIdLpdHg7ZHBPZ63bmzp2L++67D+Xl5ejXrx/+8Ic/YPDgweL6u3fvxq9//Wu8+OKL+Oqrr9CjRw/MmTMH55xzjscc6GXc3dDB2rZti+OOOw4bN25EQUEBIpEIdu/enbRORUWFsv/QWlOnTsWePXsS09atWw8lS0R0uLCpLx0ixhCiForxgw5RNuIHwBhC1CQxhmTdq6++ikGDBuHCCy9Ep06dMGDAADz66KOJ5Zs3b0Z5eXlSt25t2rRBYWGh2K0bW2oRUWPT0N0NPffccygpKcH06dOxevVq9OvXD8XFxdixY4dy/UgkgjPPPBOffvop/vznP2P9+vV49NFHceSRRx7qqRAdUiXBvn37sGnTJnTp0gUDBw6E3+9HWVlZYvn69euxZcsWDBkyRNxGMBhEfn5+0kRERM0fYwgREXmRjfgBMIYQEQHA//73PzzyyCP4zne+gzfffBPXXnstfvGLX2DBggUAkOi6rXPnzknpdN26zZo1C23atElM3bp1q9+DICJq5GbPno2JEydi/Pjx+O53v4t58+YhNzcXTzzxhHL9J554Al999RVefvllnHbaaejZsyd+8IMfoF+/fvWWx4y6G7rpppswatQo9OjRA1988QWmT58Oy7IwduxYtGnTBldddRVKSkrQrl075Ofn4/rrr8eQIUNwyimnZJwxqWLf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PPPMM3jppZcwceJE0/rp06fD4/GYjkFbWxv27ds3ZI6BTCwWQzAYzOtjQNRfjCFm+RA/AMYQGcYPov5j/EiUDzGE8UOOMYSIiCh/ZO1wQw0NDVi4cCFmzJiBmTNnYt26dejp6cGiRYsyXbS06e7uxnvvvRf/e+/evdi1axeGDx+O8ePHY/ny5bjzzjsxadIkTJw4Ebfddhuqqqowb968zBXaQcuWLcOWLVvw7LPPoqSkJD6+ZVlZGQoKClBWVobFixejoaEBw4cPR2lpKW688UbU1NTgoosuynDpnbNy5UpcccUVGD9+PI4dO4YtW7Zg+/btePHFF/PmGBANVL7FkHyPHwBjCMD4QeSEfIsfAGMI48dJjCFERER5zshijzzyiDF+/HjD6/UaM2fONF599dVMFymtXn75ZQNAwrJw4ULDMAwjFosZt912m1FRUWH4fD5j9uzZRltbW2YL7SDRewdgbNy4Mf6aEydOGN/97neNYcOGGYWFhcY3vvEN45NPPslcodPg29/+tnH66acbXq/XGDVqlDF79mzjj3/8Y3x9PhwDIifkUwzJ9/hhGIwhhsH4QeSUfIofhsEYwvhxEmMIERFRftMMwzDS3hJBRERERERERERERERZJyvnJCAiIiIiIiIiIiIiovRjIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ5iIwERERERERERERERUZ76/wG82/vryq1m0AAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1600x500 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# which step from which batch to show , by default shows last step from first case\n",
    "STEP = ROLLOUT_STEPS\n",
    "BATCH = 0\n",
    "NUM_SHOW = 4\n",
    "PRINT_STATS = False # optional, print statistics\n",
    "\n",
    "fig, axes = pylab.subplots(1, 4, figsize=(16, 5))\n",
    "i = 0\n",
    "\n",
    "v = refs[STEP].staggered_tensor().numpy('batch,y,x,vector')[BATCH,:,:,0]\n",
    "if PRINT_STATS: print([\"reference \", BATCH, i, np.mean(v),  np.min(v) ,  np.max(v)])\n",
    "axes[i].set_title(f\"Ref\")\n",
    "im=axes[i].imshow( v , origin='lower', cmap='magma') ;\n",
    "pylab.colorbar(im) ; i=i+1; vy_ref=v\n",
    "\n",
    "v = prediction_lowfid_only[STEP][1].staggered_tensor().numpy('batch,y,x,vector')[BATCH,:,:,0]\n",
    "if PRINT_STATS: print([\"low-fid. \", BATCH, i, np.mean(v),  np.min(v) ,  np.max(v)])\n",
    "axes[i].set_title(f\"Low-fid.\")\n",
    "im=axes[i].imshow( v , origin='lower', cmap='magma') ;\n",
    "pylab.colorbar(im) ; i=i+1; vy_lowfid=v\n",
    "\n",
    "v = prediction_corrected[STEP][1].staggered_tensor().numpy('batch,y,x,vector')[BATCH,:,:,0]\n",
    "if PRINT_STATS: print([\"corrected\", BATCH, i, np.mean(v),  np.min(v) ,  np.max(v)])\n",
    "axes[i].set_title(f\"Corr.\")\n",
    "im=axes[i].imshow( v , origin='lower', cmap='magma') ;\n",
    "pylab.colorbar(im) ; i=i+1; vy_corr=v\n",
    "\n",
    "# show error side by side\n",
    "err_lf   = vy_ref - vy_lowfid\n",
    "err_corr = vy_ref - vy_corr\n",
    "v = np.concatenate([err_lf,err_corr], axis=1)\n",
    "axes[i].set_title(f\" Errors: Low-fid & Learned\")\n",
    "im=axes[i].imshow( v , origin='lower', cmap='cividis') ;\n",
    "pylab.colorbar(im) ; i=i+1\n",
    "\n",
    "pylab.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VCs1K3uo1FoK"
   },
   "source": [
    "This shows very clearly how the pure source simulation in the middle deviates from the reference on the left. The learned version stays much closer to the reference solution.\n",
    "\n",
    "The two per-cell error images on the right also illustrate this: the source version has much larger errors (i.e. brighter colors) that show how it systematically underestimates the vortices that should form. The error for the learned version is much more evenly distributed and significantly smaller in magnitude.\n",
    "\n",
    "This concludes our evaluation. Note that the improved behavior of the AI-powered hybrid solver can be difficult to reliably measure with simple vector norms such as an MAE or $L^2$ norm. To improve this, we'd need to employ other, domain-specific metrics. In this case, metrics for fluids based on vorticity and turbulence properties of the flow would be applicable. However, in this text, we instead want to focus on DL-related topics and target another inverse problem with differentiable physics solvers in the next chapter.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VuzDHrc21FoL"
   },
   "source": [
    "\n",
    "## Next steps\n",
    "\n",
    "* Turn off the differentiable physics training (by setting `msteps=1`), and compare it with the unrolled version. This yields a _supervised_ training, as no gradients need to flow through the solver anymore. The relative errors will be substantially larger.\n",
    "\n",
    "* Likewise, try training a network with a larger `msteps` settings, e.g., 8 or 16. Note that due to the recurrent nature of the training, you'll probably have to load a pre-trained state to stabilize the first iterations (this effectively adds \"curriculum learning\").\n",
    "\n",
    "* Use the external github code to generate tougher test data, and run your trained NN on these cases. You'll see that a reduced training error not always directly correlates with an improved test performance.\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "gpuType": "A100",
   "machine_shape": "hm",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
